package setting

import (
	"fmt"
	"github.com/spf13/viper"
)

var Conf = new(AppConfig)

type AppConfig struct {
	AppEnv string `mapstructure:"env"`
	Mode   string `mapstructure:"mode"`
	Port   int    `mapstructure:"port"`
	//  对象嵌套，引入对象指针
	*Oss `mapstructure:"oss"`
}

type Oss struct {
	Endpoint        string `mapstructure:"endpoint"`
	BucketName      string `mapstructure:"bucketName"`
	ExpireTime      int64  `mapstructure:"expireTime"`
	AccessKeyId     string `mapstructure:"accessKeyId"`
	AccessKeySecret string `mapstructure:"accessKeySecret"`
	CallbackUrl     string `mapstructure:"callbackUrl"`
}

// 在配置文件中指定环境
func InitConfig(path string) {
	src := path + "/application.yaml"
	v := viper.New()
	v.SetConfigFile(src)
	err := v.ReadInConfig() // 读取配置信息
	if err != nil {
		// 读取配置信息失败
		fmt.Printf("viper.ReadInConfig failed, err:%v\n", err)
		panic(err)
		return
	}

	configs := v.AllSettings()
	// 将default中的配置全部以默认配置写入
	var envStr string
	for k, v := range configs {
		viper.SetDefault(k, v)
		if k == "env" {
			envStr = fmt.Sprintf(path+"/applicaiton-%s.yaml", v)
		}
	}

	viper.SetConfigFile(envStr)
	err = viper.ReadInConfig() // 读取配置信息
	if err != nil {
		// 读取配置信息失败
		fmt.Printf("viper.ReadInConfig failed, err:%v\n", err)
		panic(err)
		return
	}
	// 把读取到的配置信息反序列化到 Conf 变量中
	if err := viper.Unmarshal(Conf); err != nil {
		fmt.Printf("viper.Unmarshal failed, err:%v\n", err)
		panic(err)
	}
}
